Fork me on GitHub

Python 高级提升(三)

前言:

  1. 代码编写两大原则;
  2. 闭包;
  3. 装饰器。

一. 代码编写两大原则

1. 开放封闭原则
封闭:已实现的功能代码块
开放:对扩展开放
对已经实现的功能代码不允许被修改,但可以被扩展

2. 高内聚低耦合原则
高内聚:针对的是模块内部;
描述的是内部各个元素结合的密切程度,一般一个模块就做一件事情
低耦合:针对的是模块之间;模块之间关联度尽量少一点

二、闭包

1. 函数名

1. 函数名是一个引用函数代码空间的对象,这个对象在被赋值的时候也可以引用其他空间
2. 可以把函数名当做参数来使用

2. 闭包

闭包好比是一个轻量级的实例对象

1. 闭包的结构
1. 外部函数:外部函数返回内部函数的引用
2. 内部函数:内部函数使用了外部函数的参数或者的变量
把这种结构的整体称为闭包

2. 闭包与普通函数的区别
1. 普通函数能保存功能,但是不能保存传送给函数的数据(局部变量)
2. 闭包能保存功能,也可以保存数据

提示:
假如内部函数要修改外部函数的变量,则需先声明
在 python3 中使用 nonlocal 关键字(好比函数使用全局变量,使用 global 关键字)

3. 闭包的语法格式

# 闭包的语法格式
def func(num):
# 处理业务
def inner():
print("内部函数使用了外部函数的参数:%d" % num)
return inner

f1 = func(100) # f1--->inner-->内部函数的定义

f1()

三、装饰器

1. 定义

1. 在不改变函数的定义和调用的前提下,给函数扩展功能,这就是装饰器

2. 装饰器的语法格式
# 装饰器函数 本质就是闭包
def w1(func):
def inner():
# 验证1
print("正在验证...")
func()
return inner

@w1 # 本质就是 f1 = w1(f1)
def f1(): # 被装饰的函数
print("查账")

f1()

2. 装饰器装饰不同类型的函数

1. 装饰器装饰不同类型的函数
a> 装饰器装饰的函数没参数,没返回值
b> 装饰器装饰的函数有参数,没返回值
c> 装饰器装饰的函数没参数,有返回值
d> 装饰器装饰的函数有参数,有返回值

2. 万能装饰器,无|有参数(多个),无|有返回值
# 装饰器函数
def w1(func):
def inner(*args, **kwargs):
print("正在执行身份验证...") # 拓展功能
return func(*args, **kwargs) # 执行被装饰函数
return inner

# 被装饰的函数
@w1
def f1(*args, **kwargs):
print("被装饰的函数:查账")
print(args)
print(kwargs)
return "value"

3. 多个装饰器装饰一个函数

""" 
多个装饰器装饰一个函数的分析:
参照对象:被装饰的函数
1. 装饰时,由里到外
2. 执行的,由外到里
"""
@sms_veri # 本质 f1=sms_veri(f1) func---> f1(被装饰函数的内存空间)
@pwd_veri # 本质 f1=pwd_veri(f1) func---> f1(被装饰函数的内存空间)
def f1(): # 被装饰的函数
print("被装饰函数:转账功能")
f1()

4. 带有额外参数的装饰器函数

小结:通过装饰器工厂来实现带额外参数的装饰器函数

def outer(flag): # 装饰器的工厂函数
def wrapper(func): # 装饰器函数
def inner():
if flag==1:
print("正在执行身份验证功能...")
func() # 执行被装饰的函数
return inner
return wrapper

@outer(1) # outer(0)
def f1():
print("被装饰函数:转账功能")

f1()

5. 类装饰器

1. 以定义类的方式实现装饰器

# 类装饰器
class Person(object):

def __init__(self, func):
self.func = func
print("添加身份验证的装饰功能")

def __call__(self, *args, **kwargs):
print("正在身份验证...")
self.func()

@Person # check = Person(check)
def pay(): # 被装饰的函数
print("我是被装饰的函数...支付功能...")

# 目前的 check 起始就是 Person 类的实例对象
# 实例对象():表示该对象是可调用的,所有需要对创建该对象的类添加 __call__ 魔法方法
pay()

四、装饰器总结

1. 装饰器函数只有一个参数就是被装饰的函数的引用
2. 装饰器能够将一个函数的功能在不修改代码和调用的情况下进行扩展
3. 在函数定义的上方 @装饰器函数名,即可直接使用装饰器对下面的函数进行装饰
4. 装饰器的使用场景
引入日志
函数执行时间统计
执行函数前预备处理
执行函数后清理功能
权限校验等场景
缓存
-------------本文结束感谢您的阅读-------------

本文标题:Python 高级提升(三)

文章作者:曹永林

发布时间:2018年07月24日 - 09:07

最后更新:2018年07月28日 - 10:07

原始链接:http://jovelin.cn/2018/07/24/Python 高级提升(三)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。